package 进阶阶段;

import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;

public class demo22IO流_字符流 {
    public static void main(String[] args) throws Exception {
        //当使用字节流读取文本文件时，可能会有一个小问题。就是遇到中文字符时，可能不会显示完整的字符，那是因为一个中文
        //字符,可能占用多个字节存储。所以Java提供一些字符流类，以字符为单位读写数据，专门用于处理文本文件。
        //小贴士：字符流，只能操作文本文件，不能操作图片，视频等非文本文件。

        System.out.println("------------------------------------------");
        System.out.println("字符输出流：Writer");

        //字符输出流：Writer
            //close()：关闭此输出流,并释放与此流相关联的任何系统资源。
            //flush()：刷新此输出流.并强制任何缓冲的输出字符被写出。
            //write(int c)：写出一个字符。
            //write(char[] cbuf)：将 b.length字符从指定的字符数组,写出此输出流。
            //write(char[] b, int off, int len)：从指定的字符数组写出 len字符，从偏移量 off开始输出到此输出流。
            //write(String str)：写出一个字符串。//多了写直接写字符串,字节流把字符串变成字节数组写过去,调用getBytes()得到字节数组

        //Writer的子类
        //FileWriter类：写出字符到文件的便利类。构造时使用系统默认的字符编码和默认字符缓冲区。
            //FileWriter(File file)： 创建一个新的 FileWriter，给定要读取的File对象。
            //FileWriter(String fileName)： 创建一个新的 FileWriter，给定要读取的文件的名称。

        // 使用File对象创建流对象
        File file1 = new File("a.txt");
        FileWriter fw1 = new FileWriter(file1);

        // 使用文件名称创建流对象
        FileWriter fw2 = new FileWriter("b.txt");

        // 写出数据
        fw1.write(97); // 写出第1个字符
        fw1.write('b'); // 写出第2个字符
        fw1.write('C'); // 写出第3个字符
        fw1.write(29233); // 写出第4个字符，中文编码表中29233对应一个汉字'爱'。
        char[] chars = "未来世界".toCharArray();
        fw1.write(chars,2,2);//chars的数组从2下标开始，数两位写出数据
        fw1.write("\r\n");//输出到文件中进行换行
        String msg = "直接输出数据";
        fw1.write(msg);

      	/*
        【注意】关闭资源时,与FileOutputStream不同。
      	 如果不关闭,数据只是保存到缓冲区数组，并未保存到文件。
        */
        //因为内置缓冲区数组的原因，如果不关闭输出流，无法写出字符到文件中。但是关闭的流对象，是无法继续写出数据的。如果我们既想写出数据，又想继续使用流，就需要`flush` 方法。

//        fw1.close();//没有关闭流，字符流没有将字符写入到文件中
        fw1.flush();//刷新此输出流.并强制任何缓冲的输出字符被写出，即使没有关闭流也会将字符写入文件中

        fw1.close();



        System.out.println("------------------------------------------");
        System.out.println("字符输入流：Reader");

        //字符输入流：Reader
            //close()：关闭此流,并释放与此流相关联的任何系统资源。
            //read()：从输入流读取一个字符。
            //read(char[] cbuf)：从输入流中读取一些字符，并将它们存储到字符数组cbuf中。

        //Reader的子类
        //FileReader类：读取字符文件的便利类
            //FileReader(File file)：创建一个新的 FileReader ，给定要读取的File对象。
            //FileReader(String fileName)：创建一个新的 FileReader，给定要读取的文件的名称。

        // 使用File对象创建流对象
        File file = new File("a.txt");
        FileReader fr1 = new FileReader(file);

        // 使用文件名称创建流对象
        FileReader fr2 = new FileReader("b.txt");

        //循环打印一个字符
//        int a;
//        while ((a = fr1.read())!=-1){
//            System.out.println((char) a);
//        }

        //循环打印多个字符
        int len;
        // 定义字符数组，作为装字符数据的容器
        char[] cbuf = new char[2];
        // 循环读取
        while ((len = fr1.read(cbuf))!=-1) {
            System.out.println(new String(cbuf,0,len));
        }

        fr1.close();
        fr2.close();

    }
}
